文本文件和二进制文件,文件读取结束的判定以及文件缓冲区 (C语言) |
您所在的位置:网站首页 › matlab fopen返回值3 › 文本文件和二进制文件,文件读取结束的判定以及文件缓冲区 (C语言) |
目录 1.文本文件和二进制文件 1.文本文件: 2.二进制文件 2.文件读取结束的判定 2.1feof 2.2feof正确的使用 3.文件缓冲区 根据数据的组织形式,数据文件被分为文本文件和二进制文件。 1.文本文件和二进制文件 1.文本文件:如果数据从内存中以二进制的形式存储不加转换的输出到外存中就是二进制文件。 2.二进制文件如果外存中要求以ASCII形式存储,则需要在存储前转换。以ASCII字符的形式存储到的文件就是文本文件。 数据在内存中是怎么存储的呢?字符是以ASCII码的形式存储的,数据值既可以使用ASCII码的形式存储也可以使用二进制的形式存储 如10000以二进制的形式储存:0000 0000 0000 0000 0010 0111 0001 0000(不考虑大小端) 以ASCII码的形式存储:10000。 如果10000以二进制的形式储存到磁盘中占4个字节的空间,如果是以ASCII码的形式存储到磁盘中占五个字节的空间。 测试代码: #include int main() { int a = 10000; FILE* pf = fopen("test.txt", "wb"); fwrite(&a, 4, 1, pf);//二进制的形式写到文件中 fclose(pf); pf = NULL; return 0; }·如何打开text.txt: 在文件读取过程中不能直接用feof来判断文件读取是否结束,feof是用来判断文件读取结束后的时候,判断是读取失败还是遇到文件末尾结束的。 文本文件读取是否结束,判断返回值 是否为EOF(getc)或者NULL(gets)。 例如:getc判断返回值是否为:EOF,gets判断返回值是否为NULL。 2.2feof正确的使用文本文件: #include int main() { int c = 0; FILE* pf = fopen("text.txt", "r"); if (pf == NULL) { perror(pf); return 0; } while ((c = fgetc(pf)) != EOF)//从文件中读取字符串 { putchar(c);//输出到屏幕上 } if (feof(pf))//遇到文件末尾结束 { printf("end of file reached successfully!"); } else//读取失败 { puts("I/O error when reading"); } fclose(pf); return 0; }
二进制文件: #include enum { size = 5 }; int main() { double a[size] = { 1,2,3,4,5 }; double a1[10] = { 0 }; FILE* pf = fopen("text.txt", "wb"); fwrite(a, sizeof(*a), size, pf);//将数组a的内容以二进制的形式写大文件text.txt中 fclose(pf);//关闭文件 size_t cout = 0; FILE* fp = fopen("text.txt", "rb");//打开文件 cout =fread(a1, sizeof(*a), size, pf);//将文件中的内容以二进制的形式读到数组a1中 int i = 0; for (i = 0; i < size; i++) { printf("%f ", a1[i]);//打印数组a1的元素 } if (cout == size) { if (feof)//判断文件读取结束的原因 { puts("read :of end file");//遇到文件末尾结束 } else { puts("Error");//异常情况 } } fclose(fp);//关闭文件 return 0; } 3.文件缓冲区为什会存在文件缓冲呢?因为在对文件进行读取或者写入操作的时候,如果读一个数据或者写一个数据就直接对文件进行操作会频繁的调用操作系统,这样不断调用操作系统会大大 降低操作系统的效率,因此有了文件缓冲区。 ASCII标准采用“缓冲文件系统”来对数据文件进行操作,所谓文件缓冲系统是指系统自动的在内存中为程序中每个正在使用的文件开辟的一“文件缓冲区”。从内存中向磁盘输出数据会先送到内存的缓冲区,装满缓冲区才会一起送到磁盘中。如果从磁盘向计算机读入数据,则从磁盘文件中读取数据输入到内存缓冲区(充满缓冲区),然后再从缓冲区逐个地将数据送到程序数据区(程序变量等)。缓冲区的大小根据c编译器决定。 如图: 代码验证: #include #include int main() { FILE*pf=fopen("text.txt", "w"); if (pf != NULL) { fputs("abcdef", pf); printf("睡眠十秒数据未写入text.txt\n"); Sleep(10000); fflush(pf); printf("再睡眠十秒,此时打开text.txt文件数据已经写入"); Sleep(10000); fclose(pf); pf = NULL; } return 0; }在VS2019中运行这段代码可以证明文件缓冲区的存在。 |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |